// * 封装Axios
import axios, { AxiosInstance, AxiosRequestConfig, AxiosError, AxiosResponse } from 'axios'
import { ResultType } from './interface'

// * Axios配置
const axiosConfig: AxiosRequestConfig = {
	// 默认请求地址
	baseURL: 'http://localhost:3000/api',
	// 设置请求超时时间
	timeout: 5000,
	// 跨域是否携带Cookie 【根据项目需求配置】
	withCredentials: false,
	// 配置请求头
	headers: {
		'X-Requested-With': 'XMLHttpRequest',
		'Content-Type': 'application/json'
	}
}

// * Axios请求类
class HttpRequest {
	// axios实例
	service: AxiosInstance
	// 构造函数
	constructor(config) {
		// 创建axios实例
		this.service = axios.create(config)
		// * 请求拦截器
		// 客户端请求  -> 【请求拦截器】 ->  服务器接收请求
		this.service.interceptors.request.use(
			(config: AxiosRequestConfig) => {
				console.log('请求拦截成功')
				return config
			},
			(error: AxiosError) => Promise.reject(error)
		)
		// * 响应拦截器
		// 服务器响应  ->  【响应拦截器】 -> 客户端JS接收
		this.service.interceptors.response.use(
			(response: AxiosResponse) => {
				console.log('响应拦截成功')
				// 解构出data
				const { data } = response
				return data
			},
			(error: AxiosError) => Promise.reject(error)
		)
	}
	// * get方法
	get<T = any>(url: string, params?: object, config: AxiosRequestConfig = {}): Promise<ResultType<T>> {
		return this.service.get(url, { params, ...config })
	}
	// * post方法
	post<T = any>(url: string, params?: object, config: AxiosRequestConfig = {}): Promise<ResultType<T>> {
		return this.service.post(url, params, config)
	}
	// * put方法
	put<T = any>(url: string, params?: object, config: AxiosRequestConfig = {}): Promise<ResultType<T>> {
		return this.service.put(url, params, config)
	}
	// * delete方法
	delete<T = any>(url: string, params?: any, config: AxiosRequestConfig = {}): Promise<ResultType<T>> {
		return this.service.delete(url, { data: params, ...config })
	}
}
// query 查询字符串【url地址参数】
// body  请求体    【请求内部中】
// axios中:   { params: { a: 1 } }
// axios中:   { data: { a: 1 } }
// /baidu?a=1
export default new HttpRequest(axiosConfig)

export const httpJSON = new HttpRequest({ baseURL: '/map' })
